{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **演示0305：信息熵**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **基本定义**\n",
    "* 信息熵的意义  \n",
    "信息熵主要研究的是对一个信号能够提供信息的多少进行量化。1948年，香农引入信息熵，将其定义为离散随机事件的出现概率。一个系统越是有序，信息熵就越低；反之，一个系统越是混乱，信息熵就越高。所以说，信息熵可以被认为是系统有序化程度的一个度量  \n",
    "* 信息熵的定义  \n",
    "如果一个随机变量$Y$的可能取值为：$X={y_1, y_2,\\cdots y_n}$，其概率分布分别为：$P(y_i)$。则随机变量$Y$的熵定义为：  \n",
    "  $ H(Y)=\\sum_{i=1}^n -P(y_i)log(P(y_i)) $  \n",
    " * 信息熵的值越大，说明越不确定\n",
    " * 在信息论中，常常用以2为底的对数来计算，计算出来的单位称为bits；在机器学习中，常常用自然对数来计算，计算出来的单位称为nats。在本课程中，都采用自然对数来进行计算\n",
    "* 条件熵的定义  \n",
    "条件熵表示在条件$X$下$Y$的信息熵，记作：  \n",
    "$ H(Y|X)=\\sum_{i=1}^{n} P(x_i)H(Y|x_i)=\\sum_{i=1}^n \\{P(x_i)*[-\\sum_{j=1}^m P(Y_j|x_i)log(P(Y_j|x_i))]\\} $\n",
    " * $x_i$：条件$X$的每种可能取值，假设共有$n$种取值\n",
    " * $P(x_i)$：具有$x_i$取值的样本在总样本种所占的比例\n",
    " * $H(Y|x_i)$：选取所有包含$x_i$取值的样本，基于随机变量$Y$来计算信息熵\n",
    " * $Y_j|x_i$：所有包含$x_i$取值的样本中，特征$Y$的第$j$种取值(假设共有$m$种取值)\n",
    " * $P(Y_j |x_i)$：所有包含$x_i$取值的样本中，$Y_j$取值所占的比例\n",
    "* 信息增益\n",
    " * **信息增益 = 信息熵 - 条件熵**\n",
    " * 信息增益描述了一个特征带来的信息量的多少，常用于决策树的构建和特征选择\n",
    " * 信息增益越大，就越说明该特征对确定某个事件的贡献越大(降低了某个事件的不确定性)，或者说，该特征是某个事件的主要特征"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### **案例1：计算下列系统的信息熵、条件熵和信息增益**\n",
    ">  \n",
    "假设有下列训练样本：  \n",
    "![](../images/030501.png)  \n",
    "设置\"是否外出打球\"这一随机变量为$Y$，湿度为随机变量$X$  \n",
    "* 信息熵计算  \n",
    "先统计 $P(y=no)=5/14; P(y=yes) = 9/14; n=2 $  \n",
    "则：$ H(Y)=-5/14*log(5/14) - 9/14*log(9/14)=0.6518 $  \n",
    "* 条件熵计算  \n",
    "统计：$P(x=high) = 7/14=1/2; P(x=normal)=7/14=1/2$  \n",
    "$ H(Y|X_{\\text{湿度}} ) = P(x=high)*H(Y|x=high)+P(x=normal)*H(Y|x=normal) $  \n",
    "而：  \n",
    "$ \\begin{aligned}\n",
    "H(Y|x=high)&=-P(Y=yes|x=high)*log(P(Y=yes|x=high)- P(Y=no|x=high*log(P(Y=no|x=high) \\\\ & =-3/7*log(3/7)-4/7*log(4/7)=0.6829\n",
    "\\end{aligned}$  \n",
    "$ H(Y|x=normal)=-6/7*log(6/7)-1/7*log(1/7)=0.4101 $  \n",
    "最终：  \n",
    "$ H(Y|X_{\\text{湿度}})=1/2*0.6829+1/2*0.4101=0.5465 $  \n",
    "* 信息增益计算\n",
    " * 信息增益 = 信息熵 - 条件熵=0.6518-0.5465=0.1053 \n",
    " * 也就是说，引入了湿度这个变量之后，就使得是否打球这个变量的信息熵就从0.6518减小到了0.5465，变得更加确定了\n",
    "* 确定最关键的特征变量\n",
    " * 信息增益越大，该特征变量就越关键\n",
    " * 考虑到系统的总信息熵是固定不变的，因此，某特征变量的条件熵越小，该变量就越关键"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
